package eu.epfc.dnet.mastermind.hibernate;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author Pierre Buvé & Nicolas Van Damme
 */
public class TusersHelper {

    Session session = null;

    public TusersHelper() {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    /**
     * Retourne les informations de l'utilisateur d'apres l'username recu en paramètre
     * @param username
     * @return 
     */
    public Tusers getUserByUsername(String username) {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("from Tusers users where users.username = '" + username + "'");
        Tusers tusers = (Tusers) q.list().get(0);
        return tusers;
    }

    /**
     * Insère un nouvel utilisateur dans la base de données.
     * @param tusers 
     */
    public void insertNewUser(Tusers tusers) {
        Transaction tx = session.beginTransaction();
        session.save(tusers);
        tx.commit();
    }

    /**
     * Retourne true si le nom de l'utilisateur se trouve dans la database
     * @param username
     * @return 
     */
    public Boolean isUsernameInDatabase(String username) {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("from Tusers users where users.username = '" + username + "'");
        return (!q.list().isEmpty());
    }

    /**
     * Retourne true si l'email se trouve dans la database
     * @param email
     * @return 
     */
    public Boolean isEmailInDatabase(String email) {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("from Tusers users where users.email = '" + email + "'");
        return (!q.list().isEmpty());
    }
    
    /**
     * Retourne le nom du première utilisateur inscrit
     * @return 
     */
    public String getFirstUser() {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("from Tusers order by id asc");
        Tusers tusers = (Tusers) q.list().get(0);
        return tusers.getUsername();
    }

    /**
     * Retourne le nom du dernier utilisateur inscrit
     * @return 
     */
    public String getLastUser() {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("from Tusers order by id desc");
        Tusers tusers = (Tusers) q.list().get(0);
        return tusers.getUsername();
    }

    /**
     * Retourne le nombre d'utilisateur inscrit
     * @return 
     */
    public String getNbrUser() {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("select count(*) from Tusers user");
        Long nbr = (Long) q.list().get(0);
        return nbr.toString();
    }

    /**
     * Retourne le nombre de victoire pour un utilisateur reçu en paramètre.
     * @param username
     * @return 
     */
    public String getNbrVictoryUser(String username) {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("select count(*) from Tgames game, Tusers user  where (status='VICTORY') AND (username='" + username + "') AND (id_user=user.id)");
        Long nbr = (Long) q.list().get(0);
        return nbr.toString();
    }

    /**
     * Retourne le nombre de défaite pour un utilisateur reçu en paramètre.
     * @param username
     * @return 
     */
    public String getNbrDefeatUser(String username) {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("select count(*) from Tgames game, Tusers user  where (status='DEFEAT') AND (username='" + username + "') AND (id_user=user.id)");
        Long nbr = (Long) q.list().get(0);
        return nbr.toString();
    }

    /**
     * Retourne le nombre de partie pour un utilisateur reçu en paramètre.
     * @param username
     * @return 
     */
    public String getNbrGameUser(String username) {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("select count(*) from Tgames game, Tusers user  where (username='" + username + "') AND (id_user=user.id)");
        Long nbr = (Long) q.list().get(0);
        return nbr.toString();
    }

    /**
     * Retourne le meilleur temps pour un utilisateur reçu en paramètre.
     * @param username
     * @return 
     */
    public String getBestTimeUser(String username) {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("select min(game.duration)from Tgames game, Tusers user where (username='" + username + "') AND (id_user=user.id) AND (status='VICTORY') AND (game.duration!=0)");
        Integer nbr = (Integer) q.list().get(0);
        if(nbr==null){nbr=0;}
        return nbr.toString();
    }
    /**
     * Retourne le pire temps pour un utilisateur reçu en paramètre.
     * @param username
     * @return 
     */
    public String getWorstTimeUser(String username) {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("select max(game.duration)from Tgames game, Tusers user where (username='" + username + "') AND (id_user=user.id) AND (status='VICTORY') AND (game.duration!=0)");
        Integer nbr = (Integer) q.list().get(0);
        if(nbr==null){nbr=0;}
        return nbr.toString();
    }

    /**
     * Retourne le temps total pour un utilisateur reçu en paramètre.
     * @param username
     * @return 
     */
    public String getTotalTimeUser(String username) {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("select sum(game.duration)from Tgames game, Tusers user where (username='" + username + "') AND (id_user=user.id) AND (game.duration!=0)");
        Long nbr = (Long) q.list().get(0);
        if(nbr==null){nbr=(long)0;}
        return nbr.toString();
    }

    /**
     * Retourne le temps moyen pour un utilisateur reçu en paramètre.
     * @param username
     * @return 
     */
    public String getAvgVictoryTimeUser(String username) {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("select avg(game.duration)from Tgames game, Tusers user where (username='" + username + "') AND (id_user=user.id) AND (status='VICTORY') AND (game.duration!=0)");
        Double nbr = (Double) q.list().get(0);
        if(nbr==null){nbr=(double)0;}
        return String.valueOf(nbr.intValue());
    }

    /**
     * Retourne la liste de tout les utilisateurs.
     * @return 
     */
    public List<String> getAllUsersList() {
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("select distinct user.username from Tusers user");
        return q.list();
    }
    
}